#ifndef _DEVICE_H_
#define _DEVICE_H_

#include "stdint.h"
#include "main.h"

#define USE_DEFENSE 0

/* 布撤防状态 */
#define DEFENCE_ON      0x00
#define DEFENCE_OFF     0x01

/* 报警状态 */
#define ALARM_ON        0x01
#define ALARM_OFF       0x00

/* 用户类型 */
typedef enum
{
    ADMIN_NONE = 0x01,      // 空用户
    ADMIN_PWD_ERROR = 0x02, // 密码错误
    ADMIN_ROOT = 0x11,      // 查询设备信息
} QF_ADMIN;

/* TCP事件类型 */
typedef enum
{
    EVENT_NORMAL = 0x00,            // system normal
    EVENT_CardSet = 0x01,           // RFID卡布防
    EVENT_CardReset = 0x02,         // RFID卡撤防
    EVENT_ALARM_ON = 0x03,          // 插入USB
    EVENT_ALARM_OFF = 0x04,         // 拔出USB
    EVENT_ALARM_OFFLINE = 0x06,     // 离线
    EVENT_SYSTEM_RESTART = 0x07,    // 系统重启
    EVENT_ENTER_WEB = 0x08,         // 进入WEB
    EVENT_EXIT_WEB = 0x09,          // 退出WEB
    EVENT_SAVE_CARD = 0x0A,         // 保存卡号
} QF_EventCode;

/* 命令 */
typedef enum
{
    CMD_INQUEIRE = 0x01,       // 查询设备信息
    CMD_SET_PARAMETERS = 0x20, // 设置参数
} QF_485CMD;

/* 蜂鸣器状态 */
typedef enum
{
    BUZZ_STATE_IDLE = 0,            // 空闲
    BUZZ_STATE_BUSY = 0x01,         // 忙碌
    BUZZ_STATE_PRESS = 0x02,        // 按键按下
    BUZZ_STATE_ALARM = 0x04,        // 防区报警
    BUZZ_STATE_EX_ALARM = 0x08,     // 扩展板报警
    BUZZ_STATE_PWD_ERROR = 0x10,    // 输入密码错误
    BUZZ_STATE_RFID = 0x20,         // RFID读卡
    BUZZ_STATE_TIMEOUT = 0x40,      // 超时报警
} BUZZ_STATE;


/* 系统状态类型 */
typedef enum
{
    SYS_MODE_NORMAL,
    SYS_MODE_NOALARM,
    SYS_MODE_SETTING,
    SYS_MODE_PASSWORD,
    SYS_MODE_LOGIN
} Sys_mode_TypeDef;

/* 防区类型 */
typedef enum
{
    DZ_ATTR_INSTANT = 1, // 即时防区
    DZ_ATTR_HOLD,        // 留守防区
    DZ_ATTR_FIRE,        // 火警防区
    DZ_ATTR_24HOUR,      // 24小时防区
    DZ_ATTR_SILENT,      // 静音防区
    DZ_ATTR_EMERGENCY,   // 紧急防区
    DZ_ATTR_DELAY,       // 延时防区
    DZ_ATTR_BYPASS,      // 旁路防区
} DZ_Attributes;

// 蜂鸣器状态
#define BUZZ_STA_BUSY 0x01
#define BUZZ_STA_PRESS 0x02
#define BUZZ_STA_ALARM 0x04

/* 设备物理信息 */
typedef struct _device_phy
{
    uint8_t ID;          // 设备ID
    char    Version[9];  // 版本号
    uint8_t Device_Type; // 设备类型
    uint8_t MAC[6];      // 设备MAC
    uint8_t IP[4];       // 设备IP
    uint8_t MASK[4];     // 掩码
    uint8_t Gateway[4];  // 网关

    char DeviceID[16];   // 设备名称
    uint8_t DNS[4];      // DNS
    uint16_t HEART_TICK; // 心跳时间
    uint16_t TIMEOUT;    // 超时时间
    uint8_t AGIP[4];     // AGIP地址
    char AGKEY[129];     // AGKEY
} dev_phy_t;

/* 设备私有信息 */
typedef struct _device_info
{
    char Name[16];            // 管理员用户名
    char PassWord[16];        // 系统设置密码
    char Card[10][4];         // 卡号
    uint8_t UsbUseStatus[16]; // 本机USB使用过状态
#if USE_DEFENSE
    uint8_t DZ_M_Warning[8];     // 报警信息
    uint8_t DZ_M_Defense[8];     // 布撤防信息
    uint8_t DZ_M_Attributes[8];  // 防区属性
    uint8_t DZ_M_Bypassed[8];    // 旁路
    uint8_t DZ_M_AlarmDelay[16]; // 延时时间
#endif
} dev_info_t;

typedef struct _device_state
{
    uint8_t UsbExUseStatus[14][17]; // 16个USB口使用状态:：0x00关闭  0x01开启	<0主，1－14扩展板> <0扩展板启用状态，1－16USB口使用状态>
    uint8_t Buzz_Switch;            // 蜂鸣器开关状态
    uint8_t BUZZ_DELAY;             // 蜂鸣器声音持续时间
    uint8_t Factory_Reset;          // 设备恢复出厂设置复位
    uint8_t DefanceStatus;          // 防区布撤防状态
} dev_state_t;

/* 设备信息 */
typedef struct _qf_device
{
    dev_phy_t phy;     // 设备物理信息
    dev_info_t info;   // 设备私有信息
    dev_state_t state; // 设备状态
} qf_dev_t;

/* 掉电消失 */
typedef struct _qf_running_state
{
    uint8_t beep;               // 蜂鸣器状态
    uint8_t chCurrentExternID;  // 当前通讯的扩展板ID
    uint8_t chCheckExternID;    // 选择的扩展板ID
    uint8_t chCurrentCardID[4]; // 当前卡号，防止放着一直操作
    uint8_t chUsbLinkStatus[16];// 当前USB连接状态
    uint8_t chRecvStatus[14];   // 通讯状态
    uint8_t chExternUsbLinkStatus[14][9];   //14个扩展板的USB口连接状态：0x00未接  0x01已接
} qf_running_state_t;

extern qf_dev_t g_qf_device;
extern qf_running_state_t g_running_state;

void Set_defence(uint8_t number, uint8_t state);    // 防区布撤防设置
void Set_DefenceType(uint8_t number, uint8_t type); // 设置防区属性
uint8_t *GetDeviceInfo(uint8_t cmd);
void parseNetworkParam(char *param, uint8_t *nums);
int Sys_Parameters_Init(void);
uint8_t IsDataValidity(const uint8_t *input, uint8_t number, uint8_t num);
void Revised_para(void);
uint8_t Login_verify(char *name, char *pwd); // 检验账号密码
uint8_t TerParamUpdate(void);
uint8_t Check_Data(uint8_t *data, uint16_t DataSize);

void Software_Reset(void);
void Reset_PWD(void);
void Restore_Factory_Settings(void);

#endif
